<?php

/**
 * Fonction de connexion à un serveur FTP distant.
 * 
 * @param String $ftp_server Adresse IP du serveur FTP.
 * @param String $ftp_user_name Identifiant du serveur FTP.
 * @param String $ftp_user_pass Mot de passe du compte.
 * @throws Exception
 * @return resource la connexion au serveur FTP
 */
function getFtpConnection($ftp_server,$ftp_user_name,$ftp_user_pass){
	
	global $logger;
	
	// Connect to FTP Server
	$conn_id = ftp_connect($ftp_server);
	
	// Login to FTP Server
	$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
	
	// Verify Log In Status
	if ((!$conn_id) || (!$login_result)) {
		$logger->error("Connexion au serveur FTP impossible : " . $ftp_server);
		throw new Exception("Connexion au serveur FTP impossible");
	} else {
		$logger->info("Connexion réalisée au serveur FTP");
	}
	
	return $conn_id;
}

/**
 * Fonction d'envoi de fichier en FTP.
 * 
 * @param String $local_file Fichier à envoyer.	
 * @param String $destination_file Localisation du fichier à envoyer sur le serveur FTP.
 * @param String $ftp_server Adresse IP du serveur FTP.
 * @param String $ftp_user_name Identifiant du serveur FTP.
 * @param String $ftp_user_pass Mot de passe du compte.
 */
function uploadFile($local_file,$destination_file,$ftp_server,$ftp_user_name,$ftp_user_pass,$archive_file=null){
	
	global $logger;
	
	// Get a new FTP connexion
	$conn_id = getFtpConnection($ftp_server,$ftp_user_name,$ftp_user_pass);
	
	// Upload the file
	ftp_pasv($conn_id, true);
    $upload = ftp_put($conn_id, $destination_file, $local_file, FTP_BINARY);  // Upload the File
    
    // Verify Upload Status
    if (!$upload) {
    	$logger->error("Le fichier n'a pas pu être envoyé correctement au serveur");
         throw new Exception("Le fichier n'a pas pu être envoyé au serveur");
    } else {
        $logger->info("Envoi du fichier réalisé avec succès : " . $local_file);
    }

    ftp_close($conn_id); // Close the FTP Connection
    
    // Archive the uploaded file into the archive directory
    if (isset($archive_file)){
    	if (rename($local_file,$archive_file)){
    		$logger->info("Fichier archivé avec succès : " . $archive_file);
    	} else {
    		$logger->error("Le fichier n'a pas pu être archivé correctement sur : " . $archive_file);
    		throw new Exception("Le fichier n'a pas pu être archivé correctement");
    	}
    }
    
    return true;
}

/**
 * Téléchargement d'un fichier depuis un serveur FTP.
 * 
 * @param String $local_directory Emplacement dans lequel sera copié le fichier.
 * @param unknown $remote_directory Emplacement du répertoire distant qu'il faut aller vérifier.
 * @param String $ftp_server Adresse IP du serveur FTP.
 * @param String $ftp_user_name Identifiant du serveur FTP.
 * @param String $ftp_user_pass Mot de passe du compte.
 * @param string $remove Suppression du fichier distant après téléchargement.
 * @throws Exception
 */
function downloadFile($local_directory,$remote_directory,$ftp_server,$ftp_user_name,$ftp_user_pass,$remove=false){
	
	global $logger;

	// Get a new FTP connexion
	$conn_id = getFtpConnection($ftp_server,$ftp_user_name,$ftp_user_pass);
	ftp_pasv($conn_id, true);
	
	// Go to the remote directory
	$logger->info("Changement du répertoire courant vers : " . $remote_directory);
	ftp_chdir($conn_id, $remote_directory);
	
	// List the files
	$contents = ftp_nlist($conn_id, ".");
	
	// Remove the "." and ".." files
	$cnt = count($contents);
	for ($i = 0; $i < $cnt;$i++){
		if ($contents[$i] == ".." || $contents[$i] == "."){
			$logger->info("Filtrage de " . $contents[$i]);
			unset($contents[$i]);
		} else {
			$logger->info("Fichier non filtré " . $contents[$i]);
		}
	};
	$files = array_values($contents);
	
	// Analyze the files count
	$nb_file_found = count($files);
	
	// No file found
	if ($nb_file_found == 0){
		$logger->info("Aucun fichier trouvé");
		return;
	} 
	
	$logger->info("Nombre de fichiers trouvés sur le serveur distant : " . $nb_file_found);

        $remote_file = getRemoteFileFromList($conn_id, $files, $nb_file_found);
	// Download the file
	$local_file = MM_CSV_PATH.$remote_file;
        
        $download = ftp_get($conn_id, $local_file, $remote_file, FTP_BINARY);

	// Verify download Status
	if (!$download) {
		$logger->error("Le fichier n'a pas pu être téléchargé correctement du serveur : ".$remote_file);
		throw new Exception("Le fichier n'a pas pu être téléchargé du serveur");
	} else {
		$logger->info("Téléchargement du fichier réalisé avec succès : " . $local_file);
	}
	
	// Remove the downloaded file
	if ($remove){
		foreach($files as $file){
			$delete = ftp_delete($conn_id, $file);
			if ($delete){
				$logger->info("Suppression du fichier distant  : ".$file);
			} else {
				$logger->error("Suppression impossible du fichier distant : ".$file);
			}
		}
	}
	
	ftp_close($conn_id); // Close the FTP Connection
	
	return $local_file;
}

function getRemoteFileFromList($conn_id, $files, $totalCount) {
    // Last element of the list 
    $target = $totalCount - 1;
    $remote_file = $files[$target];
    if (ftp_chdir($conn_id, $remote_file)) {
        //it's a directory, don't include it in your list
        ftp_cdup($conn_id); //don't forget to go back up to the directory you started in!
        return getRemoteFileFromList($conn_id, $files, $target-1);
    }
    
    return $remote_file;
}



